package net.oschina.arvin.dbjava.type;

import net.oschina.arvin.dbjava.model.Column;

import java.math.BigDecimal;
import java.util.HashSet;
import java.util.Set;

/**
 * <pre>
 *     参考地址： https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-reference-type-conversions.html
 *
 *     以下情况会被认为是BigInteger类型：
 *     1. BIT & len > 1
 *     2. BINARY
 *     3. VARBINARY
 *     4. TINYBLOB
 *     5. BLOB
 *     6. MEDIUMBLOB
 *     7. LONGBLOB
 * </pre>
 *
 * @author Arvin
 * @time 2017/9/29 9:52
 */
public class ByteArrayDBJavaTypeConverter implements DBJavaTypeConverter {

    private static final Set<String> byteArrayTypeSet = new HashSet<String>();

    static {
        byteArrayTypeSet.add("BINARY");
        byteArrayTypeSet.add("VARBINARY");
        byteArrayTypeSet.add("TINYBLOB");
        byteArrayTypeSet.add("BLOB");
        byteArrayTypeSet.add("MEDIUMBLOB");
        byteArrayTypeSet.add("LONGBLOB");
    }

    @Override
    public Class<?> convertToJavaType(Column column, boolean toBoolForLenOneNumber, boolean useUtilDate, boolean wrapMode) {
        String dataType = column.getDataType().toUpperCase();
        boolean isByteArrayType = false;
        if ("BIT".equals(dataType) && null != column.getColumnLen() && column.getColumnLen() > 1) {
            isByteArrayType = true;
        } else if (byteArrayTypeSet.contains(dataType)) {
            isByteArrayType = true;
        }
        if (isByteArrayType) {
            return wrapMode ? Byte[].class : byte[].class;
        }
        return null;
    }

    @Override
    public String convertToDBColumnType(Class<?> javaType) {
        if (javaType == byte[].class || javaType == Byte[].class) {
            return "BINARY";
        }
        return null;
    }
}
